package com.xrkol.sharelib.util;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.common.base.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class CommonUtils {

    public static String encoding(String strs) {
        try {
            if (!Strings.isNullOrEmpty(strs))
                strs = new String(strs.getBytes("ISO8859-1"), "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return strs;
    }

    public static String removeRepeat(String str, String removeStr) {
        if (str.contains(removeStr)) {
            str = str.replace(removeStr, "");
        }
        return str;
    }

    public static String removeBefore(String str, String removeStr) {
        String s = str;
        return s.substring(s.toLowerCase().indexOf(removeStr));
    }

    public static String transListForSqlIn(int length) {
        StringBuilder builder = new StringBuilder(" (");
        for (int i = 0; i < length; i++) {
            builder.append("?,");
        }
        builder.append(")");
        return builder.toString().replace(",)", ")");
    }

    public static String clearHtml(String htmlStr) {
        String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
        String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; // 定义style的正则表达式
        String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
        String regEx_qoute = "&[a-zA-Z]{1,10};"; // 定义HTML符号的正则表达式

        Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
        Matcher m_script = p_script.matcher(htmlStr);
        htmlStr = m_script.replaceAll(""); // 过滤script标签

        Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
        Matcher m_style = p_style.matcher(htmlStr);
        htmlStr = m_style.replaceAll(""); // 过滤style标签

        Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
        Matcher m_html = p_html.matcher(htmlStr);
        htmlStr = m_html.replaceAll(""); // 过滤html标签

        Pattern p_qoute = Pattern.compile(regEx_qoute, Pattern.CASE_INSENSITIVE);
        Matcher m_qoute = p_qoute.matcher(htmlStr);
        htmlStr = m_qoute.replaceAll(""); // 过滤html符号

        return htmlStr.trim(); // 返回文本字符串
    }

    /**
     * 转化对象为json
     * 
     * @param data
     * @return
     */
    public static String toJson(Object data) {
        return new Gson().toJson(data);
    }

    /**
     * 转化对象为json(格式化输出)
     * 
     * @param data
     * @return
     */
    public static String toPrettyJson(Object data) {
        return new GsonBuilder().setPrettyPrinting().create().toJson(data);
    }

    public static String getSaltScrect(String password, String salt) {
        return CommonUtils.getMD5(CommonUtils.getMD5(password) + salt);
    }

    public static String getMD5(String s) {
        char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            md.update(s.getBytes());
            byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数，
                                      // 用字节表示就是 16 个字节
            char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话，使用两个字符，
                                           // 所以表示成 16 进制需要 32 个字符
            int k = 0; // 表示转换结果中对应的字符位置
            for (int i = 0; i < 16; i++) { // 从第一个字节开始，对 MD5 的每一个字节
                                           // 转换成 16 进制字符的转换
                byte byte0 = tmp[i]; // 取第 i 个字节
                str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
                                                         // >>>
                                                         // 为逻辑右移，将符号位一起右移
                str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
            }
            s = new String(str); // 换后的结果转换为字符串

        } catch (Exception e) {
            e.printStackTrace();
        }
        return s;
    }

    public static String MD5FileName(String fileName) {
        String preffix = fileName.substring(0, fileName.lastIndexOf("."));
        preffix = System.currentTimeMillis() + "_" + getMD5(UUID.randomUUID().toString());
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        fileName = preffix + suffix;
        return fileName;
    }

    public static String fileRename(String fileName, String rename) {
        int suffixPos = fileName.lastIndexOf('.');
        String suffix = fileName.substring(suffixPos);
        return rename += suffix;
    }

    public static String MD5FileNamePreffixDate(String fileName) {
        return MD5FileName(fileName);
    }

    public static String transUrlToFilePath(String url) {
        return url.replace("/", File.separator);
    }

    public static String transFilePathToUrl(String url) {
        return url.replaceAll("\\\\", "/");
    }
}
